DANCE WITH JAVA

          開發出高質量的系統

          常用鏈接

          統計

          積分與排名

          好友之家

          最新評論

          對(重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇)這篇文章的說明

          有興趣的話可以看看這篇文章,下邊gg_shily朋友和我的一些討論,在gg_shily的激發下,我決定仔細研究一下這個問題,在我的很多文章中都用過的字節碼,我想在這里也能幫助我 。下邊是分析的結果,為了方便觀看,我把里邊的兩個類稍微變動一下
          ?1package?ov;
          ?2
          ?3public?class?Child?extends?Parent?{
          ?4
          ?5????public?void?run(Object?o)?{
          ?6????????System.out.println("?in?Child?+param:Object?");
          ?7????}

          ?8
          ?9????public?void?run(String?str)?{
          10????????System.out.println("?in?Child?+?param:String?");
          11????}

          12
          13????public?static?void?main(String[]?args)?{
          14????????
          15????????String?str?=?new?String();
          16????????Parent?p?=?new?Child();
          17????????test(p,str);
          18????}

          19????public?static?void?test(Parent?p,String?str){
          20????????p.run(str);
          21????}

          22}
          然后編譯,反編譯得到字節碼如下:(得到字節碼的方法見這里
          public?class?ov.Child?extends?ov.Parent{
          public?ov.Child();
          ??Code:
          ???
          0:???aload_0
          ???
          1:???invokespecial???#8;?//Method?ov/Parent."<init>":()V
          ???4:???return

          public?void?run(java.lang.Object);
          ??Code:
          ???
          0:???getstatic???????#16;?//Field?java/lang/System.out:Ljava/io/PrintStream;
          ???3:???ldc?????#22;?//String??in?Child?+param:Object
          ???5:???invokevirtual???#24;?//Method?java/io/PrintStream.println:(Ljava/lang/St
          ring;)V
          ???
          8:???return

          public?void?run(java.lang.String);
          ??Code:
          ???
          0:???getstatic???????#16;?//Field?java/lang/System.out:Ljava/io/PrintStream;
          ???3:???ldc?????#32;?//String??in?Child?+?param:String
          ???5:???invokevirtual???#24;?//Method?java/io/PrintStream.println:(Ljava/lang/St
          ring;)V
          ???
          8:???return

          public?static?void?main(java.lang.String[]);
          ??Code:
          ???
          0:???new?????#38;?//class?java/lang/String
          ???3:???dup
          ???
          4:???invokespecial???#40;?//Method?java/lang/String."<init>":()V
          ???7:???astore_1
          ???
          8:???new?????#1;?//class?ov/Child
          ???11:??dup
          ???
          12:??invokespecial???#41;?//Method?"<init>":()V
          ???15:??astore_2
          ???
          16:??aload_2
          ???
          17:??aload_1
          ???
          18:??invokestatic????#42;?//Method?test:(Lov/Parent;Ljava/lang/String;)V
          ???21:??return

          public?static?void?test(ov.Parent,?java.lang.String);
          ??Code:
          ???
          0:???aload_0
          ???
          1:???aload_1
          ???
          2:???invokevirtual???#50;?//Method?ov/Parent.run:(Ljava/lang/String;)V
          ???5:???return

          }
          可以看到調用的是Parent.run(String)這樣說明在編譯期間,因為重載就決定了Parent.run(String)
          然后到運行期,會向下轉型到Child.run(String)

          posted on 2006-12-20 00:32 dreamstone 閱讀(2608) 評論(3)  編輯  收藏 所屬分類: jdk相關

          評論

          # re: 對(重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇)這篇文章的說明 2006-12-20 20:43 gg_shily

          不好意思,我白天用不了msn,周末的時候才能用,我的msn是GG_sHiLy@hotmail.com,加你了,你這么說我覺得就很明白了,呵呵  回復  更多評論   

          # re: 對(重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇)這篇文章的說明 2007-02-18 01:39 喜來了

          對Java中, 怎樣從一個方法調用instance.foo(args) ,找到實際調用的函數, 在Core Java里有很詳細的描述, 簡單講, 每個Class會保存一個方法調用表, 根據instance的具體值和方法的signature尋找。 順帶的, Core Java里還詳細講述了Java Compiler和Java解釋器是怎樣從一個類名找到一個具體的類文件位置。

          其實所謂的Polymorphy也好, Overloading也好都是對Java Compiler和解釋器內部算法的抽象。如果有人需要Core Java的電子書,我這有,發封信給我。也可以從這個站上下http://www.aygfsteel.com/xilaile/archive/2007/02/16/100022.aspx
          很多關于計算機的書  回復  更多評論   

          # re: 對(重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇)這篇文章的說明 2007-06-21 13:18 s

          我要Core Java的電子書謝謝 shangcom2006@163.com  回復  更多評論   

          主站蜘蛛池模板: 兴文县| 广昌县| 阿鲁科尔沁旗| 新余市| 仙桃市| 襄樊市| 遂川县| 临安市| 招远市| 绥棱县| 贺州市| 霍林郭勒市| 五原县| 萨嘎县| 化隆| 蒙城县| 普安县| 阳城县| 宁国市| 开化县| 东至县| 库伦旗| 夏津县| 虞城县| 青岛市| 平南县| 宁明县| 佳木斯市| 大洼县| 博乐市| 华宁县| 中山市| 虹口区| 辛集市| 天柱县| 新河县| 桐城市| 新兴县| 手游| 茶陵县| 玉田县|